时间日期函数和操作符
最近更新时间: 2024-10-17 17:10:00
日期/时间操作符
操作符 | 示例 | 结果 |
---|---|---|
+ | date '2001-09-28' + integer '7' | date '2001-10-05' |
+ | date '2001-09-28' + interval '1 hour' | timestamp '2001-09-28 01:00:00' |
+ | date '2001-09-28' + time '03:00' | timestamp '2001-09-28 03:00:00' |
+ | interval '1 day' + interval '1 hour' | interval '1 day 01:00:00' |
+ | timestamp '2001-09-28 01:00' + interval '23 hours' | timestamp '2001-09-29 00:00:00' |
+ | time '01:00' + interval '3 hours' | time '04:00:00' |
- | - interval '23 hours' | interval '-23:00:00' |
- | date '2001-10-01' - date '2001-09-28' | integer '3' (days) |
- | date '2001-10-01' - integer '7' | date '2001-09-24' |
- | date '2001-09-28' - interval '1 hour' | timestamp '2001-09-27 23:00:00' |
- | time '05:00' - time '03:00' | interval '02:00:00' |
- | time '05:00' - interval '2 hours' | time '03:00:00' |
- | timestamp '2001-09-28 23:00' - interval '23 hours' | timestamp '2001-09-28 00:00:00' |
- | interval '1 day' - interval '1 hour' | interval '1 day -01:00:00' |
- | timestamp '2001-09-29 03:00' - timestamp '2001-09-27 12:00' | interval '1 day 15:00:00' |
* | 900 * interval '1 second' | interval '00:15:00' |
* | 21 * interval '1 day' | interval '21 days' |
* | double precision '3.5' * interval '1 hour' | interval '03:30:00' |
/ | interval '1 hour' / double precision '1.5' | interval '00:40:00' |
日期/时间函数
函数 | 返回值类型 | 描述 |
---|---|---|
age(timestamp,timestamp) | interval | 减去参数后的"符号化"结果,使用年和月,不只是使用天 |
age(timestamp) | interval | 从 current_date 减去参数后的结果(在午夜) |
clock_timestamp() | timestamp with time zone | 实时时钟的当前时间戳(在语句执行时变化) |
current_date | date | 当前日期 |
current_time | time with time zone | 当前时间 |
current_timestamp | timestamp with time zone | 当前日期和时间 |
date_part(text,timestamp) | double precision | 获得子域 |
date_part(text,interval) | double precision | 获得子域 |
date_trunc(text,timestamp) | timestamp | 截断到指定精度 |
date_trunc(text,interval) | interval | 截断到指定精度 |
extract(field from timestamp) | double precision | 获得子域 |
extract(field from interval) | double precision | 获得子域 |
isfinite(date) | bool | 测试有限日期 |
isfinite(timestamp) | bool | 测试有限时间戳 |
isfinite(interval) | bool | 测试有限间隔 |
justify_days(interval) | interval | 调整间隔,30天时间周期可以表示为月 |
justify_hours(interval) | interval | 调整间隔,24小时时间周期可以表示为日 |
justif_interval(interval) | interval | 调整间隔 |
localtime | time | 当前时间 |
localtimestamp | timestamp | 当前日期和时间 |
make_date(year int, month int, day int) | date | 从年、月、日创建日期 |
make_interval( years int DEFAULT 0, months int DEFAULT 0, weeksint DEFAULT 0, days int DEFAULT 0, hours int DEFAULT 0, minsint DEFAULT 0, secs double precision DEFAULT 0.0) | interval | 从年、月、周、日、时、分、秒创建 interval |
make_time(hour int, min int, sec double precision) | time | 从时、分、秒创建时间 |
make_timestamp(year int, monthint, day int, hour int, minint, sec double precision) | timestamp | 从年、月、日、时、分、秒创建时间戳 |
make_timestamptz(year int, month int, day int, hour int, min int, sec double precision, [ timezone text ]) | timestamp with time zone | 从年、月、日、时、分、秒创建带时区的时间戳,如果没有指定 timezone,则使用当前时区 |
now() | timestamp with time zone | 当前日期和时间 |
statement_timestamp() | timestamp with time zone | 当前日期和时间 |
timeofday() | text | 当前日期和时间 |
transaction_timestamp() | timestamp with time zone | 当前日期和时间 |
to_timestamp(double precision) | timestamp with time zone | 把 UNIX 时间转换成 timestamp |
OVERLAPS
(start1, end1) OVERLAPS (start2, end2)
(start1, length1) OVERLAPS (start2, length2)
操作符 OVERLAPS 通过如上两个表达式,在两个时间域重叠的时候得到真,不重叠时得到假。
示例:
postgres=# SELECT (DATE '2001-02-16', DATE '2001-12-21') OVERLAPS
postgres-# (DATE '2001-10-30', DATE '2002-10-30');
overlaps
----------
t
(1 row)
postgres=# SELECT (DATE '2001-02-16', INTERVAL '100 days') OVERLAPS
postgres-# (DATE '2001-10-30', DATE '2002-10-30');
overlaps
----------
f
(1 row)
EXTRACT
EXTRACT(field FROM source)
EXTRACT 函数从日期/时间值中抽取子域。
source 必须是一个类型 timestamp、time 或 interval 的值表达式。
field 是一个标识符或者字符串,它指定从源值中抽取的域。
EXTRACT 函数返回类型为 double precision 的值。
示例:
postgres=# SELECT EXTRACT(DAY FROM TIMESTAMP '2001-02-16 20:38:40');
date_part
-----------
16
(1 row)
postgres=# SELECT EXTRACT(DECADE FROM TIMESTAMP '2001-02-16 20:38:40');
date_part
-----------
200
(1 row)
postgres=# SELECT EXTRACT(DOY FROM TIMESTAMP '2001-02-16 20:38:40');
date_part
-----------
47
(1 row)
postgres=# SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 20:38:40');
date_part
-----------
20
(1 row)
DATE_TRUNC
date_trunc('field', source)
DATE_TRUNC 函数在概念上和用于数字的 trunc 函数类似。
source 是类型 timestamp 或 interval 的值表达式。
field 指定对输入值选用什么样的精度进行截断,有效值为:microseconds、milliseconds、second、minute、hour、day、week、month、quarter、year、decade、century、millennium。
返回值是 timestamp 类型或者所有小于选定的精度的域都设置为零的 interval。
示例:
postgres=# SELECT date_trunc('hour', TIMESTAMP '2001-02-16 20:38:40');
date_trunc
---------------------
2001-02-16 20:00:00
(1 row)
postgres=# SELECT date_trunc('year', TIMESTAMP '2001-02-16 20:38:40');
date_trunc
---------------------
2001-01-01 00:00:00
(1 row)
AT TIME ZONE
AT TIME ZONE 结构允许把时间戳转换成不同的时区。
示例:
postgres=# SELECT TIMESTAMP '2001-02-16 20:38:40' AT TIME ZONE 'MST';
timezone
------------------------
2001-02-17 11:38:40+08
(1 row)
postgres=# SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE 'MST';
timezone
---------------------
2001-02-16 18:38:40
(1 row)
第一个例子接受一个无时区的时间,戳然后把它解释成 MST 时间(UTC-7),然后这个时间转换为 PST(UTC-8)来显示。 第二个例子接受一个指定为 EST(UTC-5)的时间戳,然后把它转换成 MST(UTC-7)的当地时间。
函数 timezone(zone,timestamp) 等效于 SQL 兼容的结构 timestamp AT TIME ZONE zone。
当前日期/时间
如下函数可以获取当前日期和时间:
CURRENT_DATE
CURRENT_TIME
CURRENT_TIMESTAMP
CURRENT_TIME(precision)
CURRENT_TIMESTAMP(precision)
LOCALTIME
LOCALTIMESTAMP
LOCALTIME(precision)
LOCALTIMESTAMP(precision)
延时执行
通过如下函数可以让服务器进程延时执行:
pg_sleep(seconds)
pg_sleep_for(interval)
pg_sleep_until(timestamp with time zone)
pg_sleep 让当前的会话进程休眠 seconds 秒以后再执行。
seconds 是一个 double precision 类型的值,所以可以指定带小数的秒数。
pg_sleep_for 是针对用 interval 指定的较长休眠时间的函数。
pg_sleep_until 则可以用来休眠到一个指定的时刻唤醒。
示例:
SELECT pg_sleep(1.5);
SELECT pg_sleep_for('5 minutes');
SELECT pg_sleep_until('tomorrow 03:00');